package cn.wolf.netty.inboundhandlerandoutboundhandler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * 数据出栈 - 处理器
 */
public class MyByteToLongEncoder extends MessageToByteEncoder<Long> {

    /**
     * 编码
     *  说明:
     *  客户端数据传输执行顺序:先经过业务处理器handler -> 编码处理器 -> 发送给服务器端
     *  当业务处理器handler 发送的数据的数据类型和编码处理要求一致时,编码处理器就调用父类方法的write 的encode 方法进行编码处理,
     *  而当业务处理器handler 发送的数据的数据类型和编码处理要求不一致时,码处理器就调用父类方法的write方法直接把数据写出
     *  原理:public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
     *         ByteBuf buf = null;
     *         try {
     *             if (acceptOutboundMessage(msg)) {
     *                 @SuppressWarnings("unchecked")
     *                 I cast = (I) msg;
     *                 buf = allocateBuffer(ctx, cast, preferDirect);
     *                 try {
     *                     encode(ctx, cast, buf);
     *                 ...........
     *             } else {
     *                 ctx.write(msg, promise);
     *             }
     * @param channelHandlerContext 上下文对象
     * @param aLong                 数据类型
     * @param byteBuf               字节码数据
     * @throws Exception 异常
     */
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, Long aLong, ByteBuf byteBuf) throws Exception {
        System.out.println("MyByteToLongEncoder encoder 被调用!");
        System.out.println("msg=" + aLong);
        byteBuf.writeLong(aLong);
    }
}
